#include "widget.h"
#include "config.h"
#include"heroplane.h"
#include"bullet.h"
#include <QIcon>
#include <QPainter>
#include <QDebug>
#include <ctime>
#include <QMessageBox>
#include<QMouseEvent>
#include"bomb.h"
#include<QSound>
#include"enemy4.h"
#include"bomb4.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QMessageBox::question(this, "游戏说明" ,"本游戏中会有我方飞机以及敌方飞机，你的任务是击落敌方飞机。本游戏采取一击必杀模式，即你打敌机和敌机打你只需一枪致命，记住小心中间的敌机会射出子弹噢",
                              QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
    //初始化场景
    initScene();

    //启动游戏
   playGame();

}

Widget::~Widget()
{
}
/* 初始化场景 */
void Widget::initScene()
{
    //设置窗口尺寸及标题图标
    setFixedSize(GAME_WIDTH, GAME_HEIGHT);
    setWindowTitle(GAME_TITLE);
    setWindowIcon(QIcon(GAME_ICON));

    //定时器设置
    m_Timer.setInterval(GAME_INTERVAL);
    //
m_recorder=0;
    //时间随机种子
    srand((unsigned int)time(NULL));
}

/* 启动游戏 */
void Widget::playGame()
{
// bgm
    QSound::play(SOUND_BGM);


    //启动定时器
    m_Timer.start();

    connect(&m_Timer, &QTimer::timeout, [=](){
        //是否停止
       isstop();
       //更新元素
       updatePosition();
       //敌机出场
        enemytoscene();
        enemytoscene4();

      //更新绘制
        update();
        //碰撞检测
        collisionDetection();
         collisionDetection4();
         collisionDetectionm();
    });
}


// 更新游戏中元素坐标
void Widget::updatePosition()
{
    //更新地图坐标
    m_map.mapPosition();


//发射子弹
    m_hero.shoot();
    //计算所有非空闲子弹的坐标
    for(int i=0;i<BULLET_NUM;i++){
        //
        if(m_hero.m_bullet[i].m_Free==false){
            m_hero.m_bullet[i].updatePosition();
        }
    }
    //敌机发射子弹

   m_Enemy4.shoot4();

    //计算所有非空闲子弹的坐标
    for(int i=0;i<BULLET_NUM1;i++){
        //
        if(m_Enemy4.m_bullet1[i].m_Free==false){
            m_Enemy4.m_bullet1[i].updatePosition();
        }
    }

    //测试子弹
    //temp_Bullet.m_Free=false;
//temp_Bullet.updatePosition();

    //敌机出场
    for(int i=0;i<ENEMY_NUM;i++){
        if(m_enemy[i].m_Free==false){
            m_enemy[i].updatePosition();
        }
       }
    for(int h=0;h<ENEMY_NUM4;h++){
        if(m_enemy4[h].m_Free==false){
            m_enemy4[h].updatePosition();
        }}
//计算爆炸播放的图片
    for(int i=0;i<BOMB_NUM;i++){
        if(m_bomb[i].m_Free==false){
            //切图
            m_bomb[i].updateInfo();
        }
    }
    //
    for(int i=0;i<BOMB_NUM4;i++){
        if(m_bomb4[i].m_Free==false){
            //切图
            m_bomb4[i].updateInfo4();
        }
    }

}

//绘制
void Widget::paintEvent(QPaintEvent *){

    QPainter painter(this);

    //绘制地图
    painter.drawPixmap(0, m_map.m_map1_posY, m_map.m_map1);
    painter.drawPixmap(0, m_map.m_map2_posY, m_map.m_map2);
//绘制英雄飞机
    painter.drawPixmap(m_hero.m_X,m_hero.m_Y,m_hero.m_Plane);
//painter.drawPixmap(151,-130,m_enemy1.m_Plane1);
    painter.drawPixmap(151,-130,m_enemy1.m_enemy3);
    //painter.drawPixmap(temp_Bullet.m_X,temp_Bullet.m_Y,temp_Bullet.m_Bullet);
    //绘制子弹
    for(int i=0;i<BULLET_NUM;i++){
        //
        if(m_hero.m_bullet[i].m_Free==false){
            painter.drawPixmap(m_hero.m_bullet[i].m_X,m_hero.m_bullet[i].m_Y,m_hero.m_bullet[i].m_Bullet);
        }
}
    //绘制敌机子弹
    for(int i=0;i<BULLET_NUM1;i++){
        //
        if(m_Enemy4.m_bullet1[i].m_Free==false){
            painter.drawPixmap(m_Enemy4.m_bullet1[i].m_X,m_Enemy4.m_bullet1[i].m_Y,m_Enemy4.m_bullet1[i].m_bullet1);
}
    }
            //绘制敌机
        for(int i=0;i<ENEMY_NUM;i++){
            if(m_enemy[i].m_Free==false){
                painter.drawPixmap(m_enemy[i].m_X,m_enemy[i].m_Y,m_enemy[i].m_enemy);

        }
        }
        for(int i=0;i<ENEMY_NUM4;i++){
            if(m_enemy4[i].m_Free==false){
                painter.drawPixmap(m_enemy4[i].m_X,m_enemy4[i].m_Y,m_enemy4[i].m_enemy4);

        }
        }
        //绘制爆炸
        for(int i=0;i<BOMB_NUM;i++){
            if(m_bomb[i].m_Free==false){
                //切图
painter.drawPixmap(m_bomb[i].m_X,m_bomb[i].m_Y,m_bomb[i].m_pixArr[m_bomb[i].m_index]);

            }
        }

        //绘制爆炸
        for(int i=0;i<BOMB_NUM4;i++){
            if(m_bomb4[i].m_Free==false){
                //切图
painter.drawPixmap(m_bomb4[i].m_X,m_bomb4[i].m_Y,m_bomb4[i].m_pixArr[m_bomb4[i].m_index]);

            }
        }
}
void Widget::mouseMoveEvent(QMouseEvent *event){//计算鼠标按下的位置
  int x=  event->x()-m_hero.m_Rect.width()*0.5;
   int y= event->y()-m_hero.m_Rect.height()*0.5;

   //边界检测
   if(x<=0){
       x=0;//
   }
   if(x>=GAME_WIDTH-m_hero.m_Rect.width()){
       x=GAME_WIDTH-m_hero.m_Rect.width();//
   }
   if(y<=0){
       y=0;
   }
   if(y>=GAME_HEIGHT-m_hero.m_Rect.height()){
      y= GAME_HEIGHT-m_hero.m_Rect.height();
   }
   m_hero.setPosition(x,y);
   //发现拖拽点不在中央，要偏移


}
//
void Widget::enemytoscene()
{
    m_recorder++;
    if(m_recorder<ENEMY_INTERVAL){
        return;}
        m_recorder=0;
        for(int i=0;i<ENEMY_NUM;i++){
          //
            if(m_enemy[i].m_Free){
                m_enemy[i].m_Free=false;

                //敌机坐标
                m_enemy[i].m_X=rand()%(GAME_WIDTH-m_enemy[i].m_Rect.width());
                m_enemy[i].m_Y=0-m_enemy[i].m_Rect.height();
                break;
            }
        }
}
void Widget::enemytoscene4()
{
    m_recorder4++;
    if(m_recorder4<ENEMY_INTERVAL4){
        return;}
        m_recorder4=0;
        for(int i=0;i<ENEMY_NUM4;i++){
          //
            if(m_enemy4[i].m_Free){
                m_enemy4[i].m_Free=false;

                //敌机坐标
                m_enemy4[i].m_X=rand()%(GAME_WIDTH-m_enemy4[i].m_Rect.width());
                m_enemy4[i].m_Y=0-m_enemy4[i].m_Rect.height();
                break;
            }
        }
}

void Widget::collisionDetection()
{
    //遍历所有的非空闲的敌机
    for(int i=0;i<ENEMY_NUM;i++){
      //空闲的飞机，执行下一次循环
        if(m_enemy[i].m_Free){
continue;
    }
        //遍历所有的非空闲的子弹
        for(int j=0;j<BULLET_NUM;j++){
            if(m_hero.m_bullet[j].m_Free){
                continue;
            }

        //碰撞检测---子弹和飞机相交，发生碰撞，同时将飞机和子弹空闲状态设为真
       if(m_enemy[i].m_Rect.intersects(m_hero.m_bullet[j].m_Rect)){
           m_enemy[i].m_Free=true;
                   m_hero.m_bullet[j].m_Free=true;
                   //播放爆炸效果
                   for(int k=0;k<BOMB_NUM;k++){
                       if(m_bomb[k].m_Free){
                           //空闲的爆炸，可以播放
 QSound::play(SOUND_BOMB);
                 m_bomb[k].m_Free=false;
                 //更新爆炸坐标
                 m_bomb[k].m_X=m_enemy[i].m_X;
                 m_bomb[k].m_Y=m_enemy[i].m_Y;
                 break;
                       }
                   }
       }
}
        }
}
void Widget::collisionDetection4()
{
    //遍历所有的非空闲的敌机
    for(int i=0;i<ENEMY_NUM4;i++){
      //空闲的飞机，执行下一次循环
        if(m_enemy4[i].m_Free){
continue;
    }
        //遍历所有的非空闲的子弹
        for(int j=0;j<BULLET_NUM;j++){
            if(m_hero.m_bullet[j].m_Free){
                continue;
            }

        //碰撞检测---子弹和飞机相交，发生碰撞，同时将飞机和子弹空闲状态设为真
       if(m_enemy4[i].m_Rect.intersects(m_hero.m_bullet[j].m_Rect)){
           m_enemy4[i].m_Free=true;
                   m_hero.m_bullet[j].m_Free=true;
                   //播放爆炸效果
                   for(int k=0;k<BOMB_NUM4;k++){
                       if(m_bomb4[k].m_Free){
                           //空闲的爆炸，可以播放
        //QSound::play(SOUND_BOMB);
                 m_bomb4[k].m_Free=false;
                 //更新爆炸坐标
                 m_bomb4[k].m_X=m_enemy4[i].m_X;
                 m_bomb4[k].m_Y=m_enemy4[i].m_Y;

                 break;
                       }
                   }
       }
}
}
}
void Widget::collisionDetectionm()
{
  //遍历所有的非空闲的敌机

        //遍历所有的非空闲的子弹
        for(int j=0;j<BULLET_NUM1;j++){
            if(m_enemy1.m_bullet1[j].m_Free){
                continue;
            }

        //碰撞检测---子弹和飞机相交，发生碰撞，同时将飞机和子弹空闲状态设为真
       if(m_hero.m_Rect.intersects(m_enemy1.m_bullet1[j].m_Rect)){
                       m_hero.live=false;
                       break;
                   }

}

    for(int i=0;i<ENEMY_NUM;i++){
      //空闲的飞机，执行下一次循环
        if(m_enemy[i].m_Free){
continue;
    }
        if(m_hero.m_Rect.intersects(m_enemy[i].m_Rect)){
         m_hero.live=false;
                    break;
 }
}
    for(int i=0;i<ENEMY_NUM4;i++){
      //空闲的飞机，执行下一次循环
        if(m_enemy4[i].m_Free){
continue;
    }
        if(m_enemy4[i].m_Rect.intersects(m_hero.m_Rect)){
         m_hero.live=false;
                    break;
 }
    }
}

void Widget::isstop()
{
    if(m_hero.live==false){
    int isContinue = QMessageBox::question(this, "GAMEOVER", "是否继续游戏",
                          QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
    if(isContinue == QMessageBox::Yes)
    {
        QMessageBox::question(this, "GAMEOVER", "想个锤子",
                                 QMessageBox::Yes |  QMessageBox::Yes);
        exit(0);
    }
    else
    {
        exit(0);
    }}
}
